<?php

namespace app\api\controller;

use app\admin\model\Goods;
use app\admin\model\Order;
use app\common\controller\Api;
use EasyWeChat\Factory;
use think\Log;

/**
 * 微信支付回调接口
 */
class Pay extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];
    public function _initialize(){
        parent::_initialize();
    }
    /**
     * 支付回调
     * @return void
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     */
    public function notify()
    {
        Log::info('订单回调');
        $config = $this->config();
        $app = Factory::payment($config);
        $response = $app->handlePaidNotify(function($message, $fail){
            // Log::info('订单回调----'.json_encode($message));
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $out_trade_no = $message['out_trade_no'];
            $order = db('paylog')->where('trade_no',$out_trade_no)->find();
            if (!$order || $order['state'] != 1) { // 如果订单不存在 或者 订单已经支付过了
                return true; // 告诉微信，我已经处理完了，订单没找到，别再通知我了
            }
            ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况，确认是已经支付 /////////////
            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态，不代表支付状态
                Log::info('订单回调----');
                // 用户是否支付成功
                if ($message['result_code'] === 'SUCCESS') {
                    db('paylog')->where('id',$order['id'])->update([
                        'pay_time' => date('Y-m-d H:i:s',time()),
                        'state' => 2
                    ]);
                    if($order['type'] == 1){
                        $model = new Goods();
                        //商品
                        $model->add(json_decode($order['goods']),$order['user_id'],$message['transaction_id']);
                    }elseif ($order['type'] == 2){
                        $model = new Order();
                        //订单
                        $model->add(json_decode($order['goods']), $order['user_id'], $out_trade_no, $message['transaction_id']);
                    }elseif ($order['type'] == 3){
                        $model = new Order();
                        //购物车
                        $model->adds(json_decode($order['goods']), $order['user_id'],$order['money'], $out_trade_no, 11);
                    }
                } elseif ($message['result_code'] === 'FAIL') {
                    db('paylog')->where('id',$order['id'])->update([
                        'state' => 3
                    ]);
                }
            } else {
                return $fail('通信失败，请稍后再通知我');
            }
            return true; // 返回处理完成
        });
        $response->send(); // return $response;
    }

    /**
     * 配置
     * @return string[]
     */
    public function config()
    {
        //获取插件
        $config = get_addon_config('epay');
        $config = [
            // 必要配置
            'app_id'             => $config['wechat']['miniapp_id'],
            'mch_id'             => $config['wechat']['mch_id'],
            'key'                => $config['wechat']['key'],   // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
            // 如需使用敏感接口（如退款、发送红包等）需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'          => ROOT_PATH.'addons/epay/certs/apiclient_cert.pem', // XXX: 绝对路径！！！！
            'key_path'           => ROOT_PATH.'addons/epay/certs/apiclient_key.pem',      // XXX: 绝对路径！！！！
            'notify_url'         => '',     // 你也可以在下单时单独设置来想覆盖它
        ];
        return $config;
    }
}
